fn main() {
    // 宏要比函数更加复杂, 宏是可以生成其他代码的代码;
    // 宏可以处理可变的参数
    // 编译器会在解释代码前展开宏
    // 宏比函数更加复杂

    // 1. 声明宏
    // 表达式（expr）、模式（pat）、类型（ty）、路径（path）、标识符（ident）、字面量（lit）等
    macro_rules! my_vec {
        // $x表示一个占位符
        // $($x:expr),*表示一个可重复的模式
        ($($x:expr),*) => {
            {
                let mut temp_vec = Vec::new();
                $(
                    temp_vec.push($x); // 这里的分号别忘了
                )*
                temp_vec
                // 这段代码类似于:
                // {
                // let mut temp_vec = Vec::new();
                // temp_vec.push(1);
                // temp_vec.push(2);
                // temp_vec.push(3);
                // temp_vec
                // }
            }
        };
    }
    let v = my_vec!(1,2,3);
    println!("v:{:?}", v);

    // 2. 过程宏, 过程宏更像函数, 三种派生宏:
    // 自定义派生、属性宏、函数宏
    // 参考hello_macro包



}